/**

函数request_irq( )在实现过程中调用了函数request_threaded_irq( )实现动态地申请注册一个中断函数request_threaded_irq( )首先对传入的参数进行安全检查根据传入的irq号获得数组irq_desc中以irq为下标的元素然后动态地创建一个irqaction描述符根据传入的参数初始化新生成的irqaction描述符最后调用函数__setup_irq( )把该描述符加入IRQ链表中完成中断的动态申请及注册

*/


#include <linux/interrupt.h>
#include<linux/irq.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
static int irq=10;  //16

// 自定义中断处理函数
static irqreturn_t irq_handler(int data, void *dev_id)
{
	printk("the data is :%d\n", data);  //data是对应中断的中断号
	printk("in the interrupt handler function\n");
	return IRQ_HANDLED;
}


static int __init request_irq_init(void)
{
	int result=0;
	printk("into request_irq_init\n");

	/*调用函数request_irq( )申请中断
	irq指中断编号
	myhandler是中断处理函数
	IRQF_DISABLED 是中断类型
	A_New_Device指中断设备名
	NULL指设备设备为
	NULL说明设备不真实存在*/

	result=request_irq(irq, irq_handler, IRQF_DISABLED, "A_New_Device", NULL);

	printk("the result of the request_irq is: %d\n", result);    //显示申请结果
	printk("out request_irq_init\n");
	return 0;
}

static void __exit request_irq_exit(void)
{
	free_irq(irq, NULL); //释放申请的中断
	printk("Goodbye request_irq\n");
	return;
}

//模块加载退出函数调用

module_init(request_irq_init);
module_exit(request_irq_exit);
